﻿// See https://aka.ms/new-console-template for more information
class Program
{
    //static async Task Main(string[] args)
    //{
    //    /*同步函数和异步函数的区别: 
    //     * 
    //     * 在调用普通同步函数时，线程会阻塞在函数调用处，直到函数执行完毕才会继续执行后面的代码。
    //     * 而使用 await 关键字调用异步函数时，线程并不会被阻塞，而是继续执行后面的代码。
    //     * 这使得异步函数能够在等待的同时，让线程去处理其他任务，提高了程序的并发性。
    //     * 
    //     */

    //    /*
    //     * 是按顺序执行每个异步方法并等待它们完成。
    //     * 这意味着每个异步方法都会在前一个完成后才开始执行，总的执行时间将会是所有异步方法执行时间的总和。
    //     * 这种方式适用于需要按顺序执行异步操作，并且后续操作依赖于前面操作结果的情况。
    //     * 
    //     */
    //    await MyAsyncMethod1();
    //    await MyAsyncMethod2();
    //    await MyAsyncMethod3();


    //    /* 
    //     * 启动了三个异步任务，并且等待它们全部完成。这意味着这三个异步任务可以同时执行，而不需要等待前一个异步任务完成。
    //     * 总的执行时间将会是三个异步任务中耗时最长的那个。
    //     * 这种方式适用于并行执行多个独立的异步操作，且后续操作不依赖于这些异步操作的顺序结果的情况。
    //    */
    //    await Task.WhenAll(MyAsyncMethod1(), MyAsyncMethod2(), MyAsyncMethod3());

    //    // 主线程继续执行其他操作
    //    Console.WriteLine("Main thread is running.");

    //    Console.WriteLine("All async methods execution complete. Press any key to exit.");
    //    Console.ReadKey();
    //}

    //static async Task MyAsyncMethod1()
    //{
    //    // 异步方法1执行的代码
    //    Console.WriteLine("Async method 1 is running.");
    //    await Task.Delay(9000); // 模拟异步操作
    //    Console.WriteLine("Async method 1 execution complete.");
    //}

    //static async Task MyAsyncMethod2()
    //{
    //    // 异步方法2执行的代码
    //    Console.WriteLine("Async method 2 is running.");
    //    await Task.Delay(6000); // 模拟异步操作
    //    Console.WriteLine("Async method 2 execution complete.");
    //}

    //static async Task MyAsyncMethod3()
    //{
    //    // 异步方法3执行的代码
    //    Console.WriteLine("Async method 3 is running.");
    //    await Task.Delay(3000); // 模拟异步操作
    //    Console.WriteLine("Async method 3 execution complete.");
    //}


    static void Main(string[] args)
    {
        Console.WriteLine($"Main函数-启动 at {DateTime.Now}");

        // 调用同步函数
        SyncMethod();

        Console.WriteLine($"Main函数-继续 at {DateTime.Now}");

        // 调用异步函数
        _ = AsyncMethod();

        Console.WriteLine($"Main函数-继续 at {DateTime.Now}");

        // 持续运行，等待异步函数完成
        Console.ReadLine();
    }

    // 同步函数
    static void SyncMethod()
    {
        Console.WriteLine($"同步函数-启动 at {DateTime.Now}");
        // 模拟耗时操作
        Task.Delay(20000).Wait();
        Console.WriteLine($"同步函数-完成 at {DateTime.Now}");
    }

    // 异步函数
    static async Task AsyncMethod()
    {
        Console.WriteLine($"异步函数-启动 at {DateTime.Now}");
        // 模拟耗时操作
        await Task.Delay(20000);
        Console.WriteLine($"异步函数-完成 at {DateTime.Now}");
    }

}
